package me.yushuai.wukong.base.service;

import me.yushuai.wukong.base.api.dto.CreateHsCodeDTO;
import me.yushuai.wukong.base.api.dto.HsCodeDTO;
import me.yushuai.wukong.base.api.dto.UpdateHsCodeDTO;
import me.yushuai.wukong.base.entity.HsCode;
import me.yushuai.wukong.common.api.AbstractPageable;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.error.WuKongException;
import me.yushuai.wukong.common.service.BaseService;
import org.springframework.data.jpa.domain.Specification;

/**
 * 海关编码业务接口
 *
 * @author zhoushuai@189.cn
 * @since 2022-08-25
 */
public interface HsCodeService extends BaseService {

    /**
     * 新建一条海关编码信息
     *
     * @param createHsCodeDTO 海关编码信息
     * @return 返回海关编码信息编号
     * @throws WuKongException 当海关编码已存在时抛出异常
     */
    Long createHsCode(CreateHsCodeDTO createHsCodeDTO) throws WuKongException;

    /**
     * 修改海关编码信息，海关编码不允许修改
     *
     * @param updateHsCodeDTO 海关编码信息
     * @return 返回修改后的海关编码编号
     * @throws WuKongException 当海关编码不存在时抛出异常
     */
    Long updateHsCode(UpdateHsCodeDTO updateHsCodeDTO) throws WuKongException;

    /**
     * 删除一条海关编码信息
     *
     * @param hsCodeId 海关编码编号
     * @throws WuKongException 当海关编码编码不存在时抛出异常
     */
    void deleteHsCode(Long hsCodeId) throws WuKongException;

    /**
     * 通过ID查询海关编码的详细信息
     *
     * @param hsCodeId 海关编码编号
     * @return 返回海关编码详细
     * @throws WuKongException 当海关编码不存在时抛出异常
     */
    HsCodeDTO findOne(Long hsCodeId) throws WuKongException;

    /**
     * 分页条件查询海关信息
     *
     * @param pageable 分页检索条件
     * @param spec     查询条件
     * @return 分页返回查询结果
     */
    PageDTO<HsCodeDTO> pagingSearchHsCode(AbstractPageable pageable, Specification<HsCode> spec);

    /**
     * 断言海关编号已存在
     *
     * @param hsCodeId 海关编码编号
     * @throws WuKongException 当海关编码不存在时抛出异常
     */
    void assertHsCodeIdExist(Long hsCodeId) throws WuKongException;

    /**
     * 断言海关编码已存在
     *
     * @param hsCode 海关编码
     * @throws WuKongException 当海关编码不存在时抛出异常
     */
    void assertHsCodeExist(String hsCode) throws WuKongException;

    /**
     * 断言海关编码不存在
     *
     * @param hsCode 海关编码
     * @throws WuKongException 当海关编码存在时抛出异常
     */
    void assertHsCodeNotExist(String hsCode) throws WuKongException;

    /**
     * 断言海关编号和编号是否匹配
     *
     * @param codeId 海关编号
     * @param code   海关编码
     * @throws WuKongException 当数据不匹配时抛出异常
     */
    void assertHsIdAndHsCodeMatching(Long codeId, String code) throws WuKongException;
}
